package cn.ichiva.luckysheet;

import cn.ichiva.luckysheet.utils.LuckySheetDb;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

import javax.annotation.PostConstruct;
import java.io.IOException;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * 使用整存整取的方法保存文档
 * 文档的同步请参考 LuckySheetWebSocketServer
 * <p>
 * 本例力求最精简
 * 可要求get/set带上文件名的方式进行多文档的协同
 * 当然多文档协同也需要websocket配合进行分组广播
 */
@Slf4j
@CrossOrigin
@RestController
public class LuckySheetController {

    private static final String FILE_LIST = "_SYSTEM_FILE_LIST_";

    //默认文档
    @Value("${def}")
    String defDoc;

    @Autowired
    LuckySheetDb db;

    @GetMapping("/version")
    public Object version() {
        return new Object() {
            public String version = "v0.0.4";
        };
    }

    private List<String> getFileList(String json) {
        List<String> l = null;
        if (json == null || json.length() == 0) {
            l = new ArrayList<>();
        } else {
            l = (List) JSON.parse(json);
        }
        return l;
    }

    private String getFileListJson(List<String> fileList) {
        if (fileList == null) {
            fileList = new ArrayList<>();
        }
        return JSON.toJSONString(fileList);
    }

    private void appendFileList(String file) {
        if (file == null || file.length() == 0) {
            return;
        }
        if (!db.exists(FILE_LIST)) {
            db.put(FILE_LIST, getFileListJson(null));
        }
        List<String> fileList = getFileList(db.getString(FILE_LIST));
        if (fileList.contains(file)) {
            return;
        }
        fileList.add(file);
        db.put(FILE_LIST, getFileListJson(fileList));
    }

    //取文件
    @RequestMapping("/list")
    public Object list() throws IOException {
        if (!db.exists(FILE_LIST)) {
            db.put(FILE_LIST, getFileListJson(null));
        }
        return getFileList(db.getString(FILE_LIST));
    }

    //取文件
    @RequestMapping("/get/{file}")
    public Object get(@PathVariable String file) throws IOException {
        log.debug("get file[{}]", file);
        if (!db.exists(file)) {
            log.info("new file[{}]", file);
            db.put(file, defDoc);
            appendFileList(file);
        }
        return db.getString(file);
    }

    //设置文件
    @PostMapping("/set/{file}")
    public Object set(@PathVariable String file, String jsonExcel) throws IOException {
        log.info("update file[{}], size[{}]", file, jsonExcel == null ? 0 : jsonExcel.length());
        db.put(file, jsonExcel);
        return true;
    }
}
